<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<link rel="stylesheet" href="../style/journal.css" type="text/css" />
<style type="text/css"><!--
.googleadsense {
	margin: 2px;
	padding: 0px;
//--></style><script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-65008-1";
urchinTracker();
</script><title>使用 HTML::FillInForm 的一个例子</title>
</head>
<body>
<a href="index.html">Journal</a>(2005) | <a href="../blog/"><b>Blog</b></a>(2006) | <a href="http://www.fayland.org/cgi-bin/random_link.pl">RandomLink</a> | <a href="AboutFayland.html">WhoAmI</a> | <a href="LiveBookmark.html">LiveBookmark</a> | <a href="http://www.fayland.org/">HomePage</a>
<p><&lt;Previous: <a href="050424.html">Day [05.4.24] I got some books for you</a>&nbsp;&nbsp;>>Next: <a href="Class-Accessor.html">$Class[0] = 'Class::Accessor';</a></p>
<h1>使用 HTML::FillInForm 的一个例子</h1>
<div class='content'>
<p>Category: <a href='Modules.html'>Modules</a> &nbsp; Keywords: <b>HTML::FillInForm</b></p><h2>Problem</h2>
先讲讲不用 HTML::FillInForm 我们得怎么做。<p>
举一个例子：编辑 Config ，配置文件。<br>
比如配置文件中有一个OS选择，每次进入配置文件编辑时，为了显示原来选中的项，一般我们得用如下代码：
<pre><code>
my $tempoutput = qq~&lt;select name="OS">\n&lt;option value="Win32">Win32\n&lt;option value="FreeBSD">FreeBSD\n&lt;option value="MacX">Mac X\n&lt;/select>\n~;
$tempoutput =~ s/value=\"$Cfg{'OS'}\"/value=\"$Cfg{'OS'}\" selected/;
print qq~请选择您使用的操作系统：$tempoutput~;
</code></pre>
这种带 select radio checkbox 的选项都要使用正则来配置您所选中的。挺麻烦的。而且代码和HTML混在一起，看起来都不舒服。<br>
所谓前人种树，后人乘凉。 <a href='http://search.cpan.org/perldoc?HTML::FillInForm'>HTML::FillInForm</a> 能很好的解决这些问题。

<h2>Solution</h2>
已编辑个人资料为例，下面讲的只是 HTML::FillInForm 的一部分。详细的查阅 perldoc <a href='http://search.cpan.org/perldoc?HTML::FillInForm'>HTML::FillInForm</a><br>
代码如下：
<pre><code>
#!/usr/bin/perl
use strict;
use warnings;
use CGI qw/:cgi/;
use CGI::Carp qw(fatalsToBrowser);
use HTML::FillInForm;

my $q = new CGI;
print $q->header;

my $fif = new HTML::FillInForm;

if ($q->param('rm') eq 'edit') {
    # Validate the form data, recommend Data::FormValidator
    ##########################
    # my $Validate_Failed = 1; # for test
    ##########################
    if ($Validate_Failed) {
        my $html = &html_form('edit');
        print $fif->fill(scalarref => \$html, fobject => $q);
    } else {
        # store the profile, YAML or Config::* is a good choice
    }
} else {
    # Load the profile && convert data as
    # it can be YAML::Load
    ##########################
    # for test
    #my %profile = (
    #    'user' => 'fayland',
    #    'password' => 'unkown',
    #    'gender' => 'm',
    #    'interest' => 'Sleep',
    #    'location' => 'EU',
    #);
    ##########################
    my $html = &html_form('edit');
    print $fif->fill(scalarref => \$html,  fdat => \%profile);
}

sub html_form {
    my $rm = shift;
    return &lt;&lt;HTML;
&lt;form action='http://localhost/cgi-bin/register.pl' method='post'>
&lt;input type='hidden' name='rm' value='$rm'>
UserName: &lt;input type='text' name='user'>&lt;br>
Password: &lt;input type='password' name='pwd'>&lt;br>
Gender: &lt;input type="radio" name='gender' value='m'>Male &lt;input type="radio" name='gender' value='f'>Female &lt;br>
Interest: &lt;input type='checkbox' name='interest' value='Computer'>Computer &lt;input type='checkbox' name='interest' value='Reading'>Reading &lt;input type='checkbox' name='interest' value='Sleep'>Sleep &lt;br>
Location:&lt;select name='location'>
&lt;option value='China'>China
&lt;option value='US'>US
&lt;option value='EU'>EU
&lt;/select>&lt;br>
&lt;input type='submit'>&lt;/form>
HTML
}
</code></pre>
详细说明：<br>
最主要需要说明的是 fill 参数选项：
<ol>
<li>scalarref => \$html, $html 为 HTML 表单标量
<li>fobject => $q, or fobject => [$q1, $q2] 这里的 $q* 都是 CGI.pm 的一个实例。如果你不用 CGI.pm, 那 $q 必须有 param 方法。
<li>fdat => \%fdat, %fdat 是一个 Hash, 可以由 YAML 或 Config::* 等获取过来。
<li>file => 'form.tmpl', file 为一 HTML::Template 模版文件。
<li>target => 'form1', 如果 $html 或 file 里多个 form ，这个用于指定是哪个 form
<li>fill_password => 0|1, 用于指定显示不显示 type='password' 的内容
<li>ignore_fields => ['prev','next'], 指定忽略的表单项
</ol>

Enjoy!</div>
<p><&lt;Previous: <a href="050424.html">Day [05.4.24] I got some books for you</a>&nbsp;&nbsp;>>Next: <a href="Class-Accessor.html">$Class[0] = 'Class::Accessor';</a></p>
<p><strong>Options:</strong> <a href='http://del.icio.us/post?title=%E4%BD%BF%E7%94%A8%20HTML::FillInForm%20%E7%9A%84%E4%B8%80%E4%B8%AA%E4%BE%8B%E5%AD%90&url=http://www.fayland.org/journal/HTML_FillInForm.html'>+Del.icio.us</a></p>
<strong>Related items</strong>
<ul><li><a href='050328.html'>Catalyst & Eplanet</a> < <span class='digit'>2005-03-28 13:19:19</span> ></li><li><a href='050423.html'>Day [05.4.23] stay with me</a> < <span class='digit'>2005-04-23 16:17:02</span> ></li><li><a href='Catalyst_Authenticate.html'>Catalyst Authenticate</a> < <span class='digit'>2005-09-26 12:50:39</span> ></li><li><a href='Catalyst_Flaw.html'>Catalyst 的一个不足（一个已去掉）</a> < <span class='digit'>2005-09-27 13:44:31</span> ></li><li><a href='Catalyst_Session_Win32.html'>Catalyst 在 Win32 下的 Session</a> < <span class='digit'>2005-09-29 11:08:04</span> ></li><li><a href='Catalyst_NoFavIcon.html'>Catalyst && favicon.ico</a> < <span class='digit'>2005-09-30 00:57:57</span> ></li><li><a href='Catalyst_Overview.html'>我对 Catalyst 的理解和介绍</a> < <span class='digit'>2005-10-08 01:39:40</span> ></li><li><a href='Catalyst_XMLRPC.html'>Catalyst && XML-RPC</a> < <span class='digit'>2005-10-11 21:50:30</span> ></li><li><a href='Catalyst_YAML.html'>Catalyst config YAML</a> < <span class='digit'>2005-12-10 12:50:39</span> ></li><li><a href='CatalystAdventCalendar_CN.html'>Catalyst Advent Calendar 中文版</a> < <span class='digit'>2005-12-15 23:28:40</span> ></li></ul>
Created on <span class="digit">2005-04-25 12:23:20</span>, Last modified on <span class="digit">2005-04-25 12:35:45</span><br />
Copyright 2004-2005 All Rights Reserved. Powered by <a href="Eplanet.html">Eplanet</a> && <a href='http://catalyst.perl.org'>Catalyst</a> 5.62.
</body>
</html>